Engineering case study · Full-stack / Platform

MingleHub

FirstMove grown into a business: a tap-to-play social game platform for bars, pubs and venues. Patrons tap the NFC tag on their table and play Chooser, Trivia and Roulette together on their own phones. No app install, no account, no login. Venues get a live dashboard and metered usage billing; the operator gets a cross-venue admin panel.

Live on Vercel · demo table seeded, just open it with friends
01 / BY THE NUMBERS
Automated tests
455
across 34 files, CI-gated
Games
3
Chooser · Trivia · Roulette
Card packs
11
300+ prompts
Patron logins
0
a table is just a URL
02 / HOW A TABLE PLAYS

Tap to table

NFC · QR · or just the link
tap the tag name in host starts theme draws a round every phone plays scores & recap

An NFC tag is just a URL carrier: it holds /<venue>/<table>, so a tap, a QR scan, and a shared link all land on the same live table. Each round's game type is drawn from the venue's theme (Party Night, Date Night, ...) deterministically per round, so every phone at the table agrees without coordination. Host hand-off, leave and rejoin, and idle timeout are all handled server-side.

Built like a business

not just a game
  • No patron accounts, ever: players never log in. Owners and admins sign in via Clerk with auto-provisioned roles
  • Multi-tenant by construction: every dashboard query derives the venue from the authenticated user, never the request. Cross-venue access is a tested 403
  • Metered usage billing: active play only (idle excluded), 15-minute blocks, per-table nightly caps, automatic monthly invoices
  • Invite-gated onboarding: admin-issued QR invites with atomic single-use redemption and a full audit trail
03 / ENGINEERING HIGHLIGHTS

F-01Real-time that reconciles

Supabase Realtime broadcast keeps every phone at the table in instant sync, while a 2-second poll stays the source of truth: a missed message (game end, host hand-off, rejoin) is reconciled, never lost.

F-02Server-authoritative games

Round numbering and game state live on the server, not the phones. Host migration, drop-to-one-player grace countdowns, and mid-game rejoins all resolve to one consistent truth.

F-03Billing built for disputes

Active span is start to last activity, so idle time is never billed and a no-play lobby bills $0. Finalizing twice is a no-op, a paid invoice can never regress, and rollups re-run safely.

F-04Deterministic theme engine

A venue's theme weights which game types and card packs appear. Each round's draw is deterministic per session and round, so all phones show the same thing with zero flicker or coordination.

F-05NFC, plain and signed

Cheap NTAG stickers carry a static URL; the same endpoint also verifies NTAG 424 DNA signed taps (signature plus a strictly-increasing counter against replay), with per-tag keys encrypted at rest.

F-06Hardened admin surface

Every admin mutation is audit-logged with actor, target and IP. Inputs reject unknown fields, endpoints are rate-limited, and a CI guard fails the build if dangerous code patterns ever land.

04 / SCREENS
Table landing screen: Welcome to The Last Chance, name entry and Join button
Tap · name in, you're at the table
Lobby listing Maya, Jesse and Riya with three phones connected and a Start the game button
Lobby · friends appear live
Trivia question with four answer tiles and a countdown
Trivia · everyone answers, timed
Trivia results leaderboard with scores for each player
Results · scores settle it
05 / TRY IT
Grab some friends

Scan to join the demo table

MingleHub is built for a table of phones. Scan the code (or open the link) on two or more phones, enter names, and start a game from the host phone: everyone plays the same round, live.

mingle-hub.vercel.app/fifty-five-bar/1 github.com/MrTig-afk/MingleHub
Scan with camera
06 / BUILT WITH
React 19ViteTailwind CSS FastAPIMangumNeon Postgres Supabase RealtimeClerkStripeVercel